﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Otgruzka.ServicesClients;
using BusinessLogic.Security;
using System.Configuration;
using Common.Export;
using System.Windows.Media;
using System.Windows;
using Otgruzka.Export;
using DataTier;
using System.ServiceModel;

namespace Otgruzka.WebForms
{
    public partial class NotShippedGoodsList : System.Web.UI.Page
    {

        #region // Скрипт T-SQL, добавляющий новый пункт меню "Дефицит товаров", страницу, и права доступа к ним для админа
//Declare @MenuId int
//Set @MenuId = (select MAX(Id)+1 from [dbo].[Menu])

//INSERT INTO [dbo].[Menu]([Id],[Name],[ToolTip],[Url])
//SELECT @MenuId ,'Дефицит товаров', 'Показать список неотгруженных товаров по поставщикам', '~/WebForms/NotShippedGoodsList.aspx'

//INSERT INTO [dbo].[PermissionMenu]([PermissionId],[MenuId])
//SELECT 1, @MenuId



//Declare @WebPageId int
//Set @WebPageId = (select MAX(Id)+1 from [dbo].[WebPage])

//INSERT INTO [dbo].[WebPage]([Id],[Name],[Title],[Url])
//SELECT @WebPageId, 'NotShippedGoodsList.aspx', null, null

//INSERT INTO [dbo].[PermissionWebPage]([PermissionId],[WebPageId])
//SELECT 5, @WebPageId



//--INSERT INTO [dbo].[PermissionWebPage]([PermissionId],[WebPageId])
//--SELECT 9, 36
        #endregion // Скрипт T-SQL, добавляющий новый пункт меню "Дефицит товаров", страницу, и права доступа к ним для админа


        /// <summary>
        /// Свойство, указывающее на наличие фильтра
        /// </summary>
        protected bool IsFiltered
        {
            get { return Session["SearchParameters"] != null && Session["SearchParameters"] is SearchParameters; }
        }


        protected void Page_Load(object sender, EventArgs e)
        {
            SearchParameters searchParameters = null;

            if (IsPostBack)
            {
                // Заполняется объект SearchParameters
                searchParameters = GetSearchParameters();

                // SearchParameters добавляется в сессию
                Session["SearchParameters"] = searchParameters;
            }

            if (!IsPostBack)
                Bind();
            FillFiltersFields();
        }

        private void Bind()
        {
            var list = GetNotShippedProductsList();

            if (list != null)
            {
                this.gvNotShippedGoods.DataSource = list;
                Session["CurrentProductList"] = list;
            }

            this.gvNotShippedGoods.DataBind();
        }


        protected void NotShippedGoodsList_Filtr_click(object sender, EventArgs e)
        {
            //// Заполняются поля ввода для фильтров из Session
            //FillFiltersFields();
            //SearchParameters searchParameters = null;
            //searchParameters = GetSearchParameters();

            //var bills = GetExpendBills();
            //if (bills != null && bills.Count > 0)
            //{
            //    //this.Orders.DataSource = orders.Where(o => o.Id == Convert.ToInt32(this.search_id.Text));

            //    // Номер заказа
            //    if (searchParameters.OrderNumber != null)
            //        this.ExpendBills.DataSource = bills.Where(b => b.Order.Header.Number.ToLower().Contains(searchParameters.OrderNumber.ToLower()));

            //    // Дата заказа
            //    if (searchParameters.OrderCreatedDate != null)
            //        this.ExpendBills.DataSource = bills.Where(b => b.Order.Header.CreatedDate.Date.ToShortDateString().Contains(searchParameters.OrderCreatedDate.Value.Date.ToShortDateString()));

            //    // Номер накладной
            //    if (searchParameters.ExpendBillNumberTotal != null)
            //        this.ExpendBills.DataSource = bills.Where(b => b.ExpendBill.NumberTotal.ToLower().Contains(searchParameters.ExpendBillNumberTotal.ToLower()));

            //    // Дата накладной
            //    if (searchParameters.ExpendBillDate != null)
            //        this.ExpendBills.DataSource = bills.Where(b => b.ExpendBill.CreatedDate.Date.ToShortDateString().Contains(searchParameters.ExpendBillDate.Value.Date.ToShortDateString()));

            //    this.ExpendBills.DataBind();
            //}
            BindAndFillFilters();
        }


        /// <summary>
        /// Заполняются поля ввода для фильтров из Session
        /// </summary>
        private void FillFiltersFields()
        {
            var searchParameters = Session["SearchParameters"] as SearchParameters;
            if (searchParameters != null)
            {
                #region Заполняются поля ввода фильтров

                var HProductName = this.gvNotShippedGoods.HeaderRow.FindControl("HProductName") as TextBox;
                var HSupplierArtikul = this.gvNotShippedGoods.HeaderRow.FindControl("HSupplierArtikul") as TextBox;
                var HSupplierName = this.gvNotShippedGoods.HeaderRow.FindControl("HSupplierName") as TextBox;

                if (HProductName != null)
                    HProductName.Text = searchParameters.ProductName;

                if (HSupplierArtikul != null)
                    HSupplierArtikul.Text = searchParameters.ProductSupplierArtikul;

                if (HSupplierName != null)
                    HSupplierName.Text = searchParameters.ProductSupplierName;

                #endregion Заполняются поля ввода фильтров
            }
        }


        /// <summary>
        /// Возвращается объект SearchParameters формирующийся из полей ввода фильтров
        /// </summary>
        /// <returns></returns>
        private SearchParameters GetSearchParameters()
        {
            // Создаем экземпляр SearchParameters
            SearchParameters searchParameters = new SearchParameters();

            #region Заполняется объект SearchParameters

            var HProductName = this.gvNotShippedGoods.HeaderRow.FindControl("HProductName") as TextBox;
            var HSupplierArtikul = this.gvNotShippedGoods.HeaderRow.FindControl("HSupplierArtikul") as TextBox;
            var HSupplierName = this.gvNotShippedGoods.HeaderRow.FindControl("HSupplierName") as TextBox;

            if (HProductName != null && !string.IsNullOrEmpty(HProductName.Text))
                searchParameters.ProductName = HProductName.Text;

            if (HSupplierArtikul != null && !string.IsNullOrEmpty(HSupplierArtikul.Text))
                searchParameters.ProductSupplierArtikul = HSupplierArtikul.Text;

            if (HSupplierName != null && !string.IsNullOrEmpty(HSupplierName.Text))
                searchParameters.ProductSupplierName = HSupplierName.Text;

            // Если все поля с фильтрами пустые, то объект с параметрами приравнивается NULL
            if ((HProductName == null || string.IsNullOrEmpty(HProductName.Text)) &&
                (HSupplierArtikul == null || string.IsNullOrEmpty(HSupplierArtikul.Text)) &&
                (HSupplierName == null || string.IsNullOrEmpty(HSupplierName.Text))
            )
            {
                searchParameters = null;// searchParameters = (Session["SearchParameters"] != null) ? Session["SearchParameters"] as SearchParameters : null;
            }

            #endregion Заполняется объект SearchParameters
            { }
            return searchParameters;
        }


        protected void NotShippedGoodsList_Clear_Filtr(object sender, EventArgs e)
        {
            Session["SearchParameters"] = null;
            Response.Redirect("~/WebForms/NotShippedGoodsList.aspx");
        }


        /// <summary>
        /// Формирует список неотгруженных товаров из списка Заказов с неотгруженными товарами
        /// </summary>
        /// <returns></returns>
        private List<OrderSpec> GetNotShippedProductsList()
        {
            var client = new OrdersClient();
            try
            {
                var searchParameters = (Session["SearchParameters"] != null) ? Session["SearchParameters"] as SearchParameters : null;
                var products = client.GetNotShippedGoodsList(UserPrincipal.Current.UserId, searchParameters);

                return products;
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
                return null;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
                return null;
            }
        }


        //protected void gvNotShippedGoods_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        int id = Convert.ToInt32(gvNotShippedGoods.SelectedRow.Cells[0].Text);
        //        int orderId = Convert.ToInt32(gvNotShippedGoods.SelectedRow.Cells[2].Text);
        //        Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}&exbid={1}", orderId, id));
        //    }
        //    catch (Exception ex)
        //    { }
        //}


        /// <summary>
        /// Событие заполнения строки грида данными
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvNotShippedGoods_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //if (e.Row.RowType == DataControlRowType.DataRow)
            //{
            //    int expendedBillId = 0;
            //    var dataItem = e.Row.DataItem as Otgruzka.ExpendBillServiceReference.ExpendBill;
            //    if (dataItem != null)
            //    {
            //        expendedBillId = dataItem.Id;
            //    }

            //    if (e.Row.RowType == DataControlRowType.DataRow)
            //    {
            //        e.Row.Attributes["onmouseover"] = "this.style.backgroundColor='#6b8cbe'";
            //        e.Row.Attributes["onmouseout"] = "this.style.backgroundColor='#FFFFFF'";
            //        e.Row.Attributes["style"] = "cursor:hand;";

            //        var grid = sender as GridView;
            //        string postback = Page.ClientScript.GetPostBackEventReference(grid, string.Format("Select${0}", e.Row.RowIndex));
            //        e.Row.Attributes.Add("onclick", postback.ToString());
            //    }
            //}
        }



        //protected void gvNotShippedGoods_PageIndexChanging(object sender, GridViewPageEventArgs e)
        //{
        //    var list = GetOrders();
        //    if (list != null && list.Count > 0)
        //    {
        //        gvNotShippedGoods.PageIndex = e.NewPageIndex;
        //        gvNotShippedGoods.DataSource = list.ToList();
        //        gvNotShippedGoods.DataBind();
        //    }
        //}


        private void BindAndFillFilters()
        {
            SearchParameters searchParameters = null;
            searchParameters = GetSearchParameters();
            Bind();
            FillFiltersFields();
        }


        protected void btnExcelButton_Click(object sender, EventArgs e)
        {
            this.ExportToExcel();
        }


        #region методы экспорта в Эксель

        private ExcelDocument prepareDocument()
        {
            var doc = new ExcelDocument();

            WindowProperties wp = new WindowProperties()
            {
                WindowHeight = 12015,
                WindowWidth = 19440,
                WindowTopX = 480,
                WindowTopY = 150
            };

            DocumentProperties dp = new DocumentProperties()
            {
                Author = "",
                LastAuthor = "",
                Company = "Компания МЕГА",
                Version = 1.00
            };

            doc.Header = new ExcelHeader()
            {
                WindowProperties = wp,
                DocumentProperties = dp
            };

            var workSheet = new Worksheet()
            {
                Name = "Товары",
                Table = new Common.Export.Table()
            };


            doc.Worksheets.Add(workSheet);

            return doc;
        }


        /// <summary>
        /// Создание стилей для оформления документа
        /// </summary>
        /// <param name="doc"></param>
        protected void createStyles(ExcelDocument doc)
        {
            var styleBold = new CellStyle()
            {
                ID = "bold",
                Borders = new Thickness(1),
                FontSize = 10,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                FontFamily = new FontFamily("Arial")
            };
            var styleBoldNonBorder = new CellStyle()
            {
                ID = "boldNonBorder",
                FontSize = 10,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                FontFamily = new FontFamily("Arial")
            };
            var style = new CellStyle()
            {
                ID = "normal",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 9,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                FontFamily = new FontFamily("Arial")
            };
            var boldCenterHeadFoot = new CellStyle()
            {
                ID = "boldCenterHeadFoot",
                Borders = new Thickness(1),
                FontSize = 10,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };

            var normalCenter = new CellStyle()
            {
                ID = "normalCenter",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 9,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };

            var boldCenterRight = new CellStyle()
            {
                ID = "boldCenterRight",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 10,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };

            doc.Styles.Add(styleBold);
            doc.Styles.Add(styleBoldNonBorder);
            doc.Styles.Add(style);
            doc.Styles.Add(boldCenterHeadFoot);
            doc.Styles.Add(boldCenterRight);
            doc.Styles.Add(normalCenter);
        }


        /// <summary>
        /// Оформление документа созданными стилями
        /// </summary>
        /// <param name="doc"></param>
        protected void setStyles(ExcelDocument doc)
        {
            var tbl = doc.Worksheets[0].Table;

            tbl.BeforeRows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "boldNonBorder"));
            tbl.HeaderRows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "boldCenterHeadFoot"));
            tbl.Rows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "normal"));

            for (int i = 0; i < tbl.Rows.Count; ++i)
            {
                tbl.Rows[i].Cells[0].StyleID = "normal";
                tbl.Rows[i].Cells[1].StyleID = "normalCenter";
                tbl.Rows[i].Cells[2].StyleID = "normalCenter";
                tbl.Rows[i].Cells[3].StyleID = "normalCenter";

                //for (int j = 1; j < tbl.Columns.Count - 1; ++j)
                //{
                //    tbl.Rows[i].Cells[j].StyleID = "normalCenter";
                //}
                //tbl.Rows[i].Cells[tbl.Columns.Count - 1].StyleID = "boldCenterRight";
            }

            //tbl.Rows[tbl.Rows.Count - 1].Cells[0].StyleID = "bold";
            //for (int i = 1; i < tbl.Columns.Count; ++i)
            //{
            //    tbl.Rows[tbl.Rows.Count - 1].Cells[i].StyleID = "boldCenterHeadFoot";
            //}
        }


        /// <summary>
        /// Создание столбцов и заголовков формируемого файла
        /// </summary>
        /// <param name="table"></param>
        /// <param name="data"></param>
        protected void createExcelColumnsAndHeaders(Common.Export.Table table, OrderSpec data)
        {
            int index = 1;

            table.Columns.Add(new Column() { AutoFitWidth = 1, Width = 300.0, Index = index++ });
            table.Columns.Add(new Column() { AutoFitWidth = 1, Width = 150.0, Index = index++ });
            table.Columns.Add(new Column() { AutoFitWidth = 1, Width = 150.0, Index = index++ });
            table.Columns.Add(new Column() { AutoFitWidth = 1, Width = 150.0, Index = index++ });

            Row beforeRow1 = new Row();
            beforeRow1.Cells.Add(new Cell() { Data = "ООО \"Мега\". Телефон: +7(495) 665-67-04, почта: statusvip@inbox.ru, время работы с 10 до 18 часов.", Type = "String", MergeAcross = 3 });
            Row beforeRow2 = new Row();
            beforeRow2.Cells.Add(new Cell() { Data = string.Format("Дата составления: {0}", DateTime.Now), Type = "String", MergeAcross = 3 });
            Row beforeRow3 = new Row();
            beforeRow3.Cells.Add(new Cell() { MergeAcross = 3 });
            table.BeforeRows.Add(beforeRow1);
            table.BeforeRows.Add(beforeRow2);
            table.BeforeRows.Add(beforeRow3);
           
            var headerrow = new Row();
            headerrow.Cells.Add(new Cell() { Data = "Наименование товара" });
            headerrow.Cells.Add(new Cell() { Data = "Артикул товара" });
            headerrow.Cells.Add(new Cell() { Data = "Количество товара" });
            headerrow.Cells.Add(new Cell() { Data = "Поставщик" });
            table.HeaderRows.Add(headerrow);
        }


        /// <summary>
        /// Заполнение документа данными
        /// </summary>
        /// <param name="table"></param>
        /// <param name="data"></param>
        protected void appendExcelData(Common.Export.Table table, List<OrderSpec> data)
        {
            table.Rows.AddRange(data.Select(row =>
            {
                var result = new Row();
                result.Cells.Add(new Cell()
                {
                    Data = row.ProductName,
                    Type = typeof(string).Equals(row.ProductName.GetType()) ? "String" : "Number"
                });
                result.Cells.Add(new Cell()
                {
                    Data = row.SupplierArtikul,
                    Type = (row.SupplierArtikul == null || typeof(string).Equals(row.SupplierArtikul.GetType())) ? "String" : "Number"
                });
                result.Cells.Add(new Cell()
                {
                    Data = row.Count.ToString(),
                    Type = typeof(string).Equals(row.Count.GetType()) ? "String" : "Number"
                });
                result.Cells.Add(new Cell()
                {
                    Data = row.SupplierName,
                    Type = "String"
                });
                return result;
            }).ToArray());
        }


        /// <summary>
        /// Создание списка ссылок на загрузку файлов со списками товаров по поставщикам
        /// </summary>
        public void ExportToExcel()
        {
            if (Session["CurrentProductList"] == null)
                Session["CurrentProductList"] = GetNotShippedProductsList();

            var datalist = Session["CurrentProductList"] as List<OrderSpec>;

            if (datalist != null && datalist.Count > 0)
            {
                FillDataSuppliers(datalist);

                DownloadFileList.DataSource = DataSuppliers;
                DownloadFileList.DataBind();
                DownloadFileList.Visible = true;
            }
        }


        /// <summary>
        /// Словарь со списками товаров для каждого поставщика в рамках конкретного Заказа
        /// </summary>
        protected Dictionary<string, List<OrderSpec>> DataSuppliers = new Dictionary<string, List<OrderSpec>>();


        /// <summary>
        /// Создание словаря со списками товаров для каждого поставщика в рамках конкретного Заказа
        /// </summary>
        /// <param name="data"></param>
        private void FillDataSuppliers(List<OrderSpec> datalist)
        {
            if (datalist != null)
            {
                DataSuppliers = new Dictionary<string, List<OrderSpec>>();

                // Создается словарь <название_поставщика, список_товаров_поставщика>
                foreach (var spec in datalist)
                {
                    // Создается значение в словаре для "ВСЕХ ПОСТАВЩИКОВ"
                    string supplierName = "все поставщики";
                    if (DataSuppliers.ContainsKey(supplierName))
                    {
                        DataSuppliers[supplierName].Add(spec);
                    }
                    else
                    {
                        var list = new List<OrderSpec>();
                        list.Add(spec);
                        DataSuppliers.Add(supplierName, list);
                    }

                    // Анализ поставщиков
                    supplierName = (!string.IsNullOrEmpty(spec.SupplierName)) ? spec.SupplierName : "";
                    if (DataSuppliers.ContainsKey(supplierName))
                    {
                        DataSuppliers[supplierName].Add(spec);
                    }
                    else
                    {
                        var list = new List<OrderSpec>();
                        list.Add(spec);
                        DataSuppliers.Add(supplierName, list);
                    }
                }
            }
        }


        /// <summary>
        /// Создание файла с таблицей товаров по конкретному поставщику
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DownloadFile_Click(object sender, EventArgs e)
        {
            if (DataSuppliers == null || DataSuppliers.Keys.Count == 0)
            {
                if (Session["CurrentProductList"] == null)
                    Session["CurrentProductList"] = GetNotShippedProductsList();

                var datalist = Session["CurrentProductList"] as List<OrderSpec>;

                if (datalist != null && datalist.Count > 0)
                {
                    FillDataSuppliers(datalist);

                    var button = sender as LinkButton;
                    if (button != null /*&& !string.IsNullOrEmpty(button.CommandArgument)*/)
                    {
                        string supplierName = button.CommandArgument;
                        if (DataSuppliers.ContainsKey(supplierName))
                        {
                            // Узнаем список товаров конкретного рассматриваемого поставщика в данном Заказе
                            List<OrderSpec> products = DataSuppliers[supplierName];

                            var doc = prepareDocument();

                            createStyles(doc);
                            createExcelColumnsAndHeaders(doc.Worksheets[0].Table, datalist[0]);
                            appendExcelData(doc.Worksheets[0].Table, products);
                            setStyles(doc);

                            Response.Redirect(string.Format("~/ExcelReport.ashx?FileName={0}&ReportID={1}",
                                                            string.Format("Поставщик_{0}", supplierName),
                                                            ExcelLoader.SaveReport(Context, Guid.NewGuid(), doc.ToString())));
                        }
                        else
                        {
                            this.ErrorMessage.Text = "Поставщика с таким наименованием не найдено в списке продуктов.";
                        }
                    }
                }
            }
        }


        #endregion методы экспорта в Эксель

    }

}
